/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.module;

import base.CGraphics;
import base.CObject;
import parser.CParser;
import parser.CReader;

public class CModule extends CObject{
	public CObject[] Param;
	public int FileNumber, LineNumber;



	public void Execute() {
	}



	@Override
	public void Error( String Message ){
		CGraphics.Error( Message + " в строке " + LineNumber + " файла \"" + CReader.FilenamesList.get( FileNumber ) + "\"" );
	}



	protected void AssertParam( int ParamsQuantity ) {
		if ( Param.length != ParamsQuantity ) Error( "Модуль \"" + CParser.ModuleNames.get( this.getClass() ) + "\" " + ParamString( ParamsQuantity, "ен" ) );
	}

	
	
	protected void AssertParam( int[] Array ) {
		for( int ParamsQuantity : Array ) if ( Param.length == ParamsQuantity ) return;
	}
	
	
	
	protected void ParamArrayError( int[] Array, boolean IsFunction ) {
		String Params = "";
		for( int ParamsQuantity : Array ) {
			if( !Params.isEmpty() ) Params += ", ";
			Params += ParamsQuantity;
		}
		String Name;
		if( IsFunction ) Name = "Функция"; else Name = "Модуль";
		Error( Name + " \"" + CParser.ModuleNames.get( this.getClass() ) + "\" не может иметь иное кол-во параметров кроме " + Params );
	}
	
	
	
	@Override
	public CModule ToModule() {
		return this;
	}
					


	public String ParamString( int ParamsQuantity, String Ending ) {
		String ParamString;
		switch( ParamsQuantity ) {
			case 0:
				ParamString = "не долж" + Ending + " иметь параметров";
				break;
			case 1:
				ParamString = "долж" + Ending + " иметь единственный параметр";
				break;
			default:
				if ( ParamsQuantity % 10 >= 2 && ParamsQuantity % 10 <= 4 ) {
					ParamString = "долж" + Ending + " иметь " + ParamsQuantity + " параметра";
				} else {
					ParamString = "долж" + Ending + " иметь " + ParamsQuantity + " параметров";
				}
				break;
		}
		return ParamString;
	}



	public void SetFilePosition() {
		LineNumber = CParser.CurrentReader.CurrentLineNumber;
		FileNumber = CParser.CurrentReader.CurrentFileNumber;
	}
}
